package com.hf.proandcon;

public class MyStack {
    /**
     * 定义栈
     */
    private Object[] stack;
    /**
     * 栈的元素个数
     */
    private int len;
    /**
     * 栈顶指针位置
     */
    private int index;

    public MyStack(int len) {
        this.len = len;
        //初始化栈的数组
        stack = new Object[len];
        //初始化栈顶位置
        this.index = 0;
    }
    /**
     * 入栈操作
     */
    public synchronized void push(Object obj){
        //仓库满了
        if(index >= len){

            //生产者发现仓库满了，主动进入等待队列
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }
        //存入元素
        stack[index] = obj;
        //栈顶指针向上移动一个位置
        index++;
        // 生产者生产产品之后，要通知消费者的等待队列，可以去消费了
        this.notifyAll();
    }
    /**
     * 出栈操作
     */
    public synchronized Object pop() {
        //仓库空了
        if (index <= 0) {

            //生产者发现仓库空了，主动进入等待队列
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }
        //栈顶指针向下移动一个位置
        index--;
        //取出元素
        Object object = stack[index];
        //清空栈顶位置
        stack[index] = null;

        // 消费之后提醒生产者去生产
        this.notifyAll();
        return object;
    }
}
